#include "draw.h"


void drawImage(SDL_Surface *image, int x, int y)
  {
       SDL_Rect dest;

       /* Règle le rectangle à blitter selon la taille de l'image source */

       dest.x = x;
       dest.y = y;
       dest.w = image->w;
       dest.h = image->h;

       /* Blitte l'image entière sur l'écran aux coordonnées x et y */

       SDL_BlitSurface(image, NULL, jeu.screen, &dest);
}


void draw()
{
    int i;

    drawMap(map.background, map.startX, map.startY);
    drawAnimatedEntity(&player);

    for(i=0;i<jeu.nombreMonstres;i++)
    {
        if((mob[i].x+mob[i].w > map.startX) && (mob[i].x < map.startX+SCREEN_WIDTH))
        {
            drawAnimatedEntity(&mob[i]);   
        }
    }

    drawFireballs();
    drawHud();

            
    SDL_Flip(jeu.screen);
    SDL_Delay(1);
}


SDL_Surface *loadImage(char *name)
{
    SDL_Surface *temp = IMG_Load(name);
    SDL_Surface *image;

    if (temp == NULL)
    {
        printf("Failed to load image %s\n", name);
        return NULL;
    }

    SDL_SetColorKey(temp,(SDL_SRCCOLORKEY | SDL_RLEACCEL),SDL_MapRGB(temp->format,TRANS_R,TRANS_G,TRANS_B));

    image = SDL_DisplayFormat(temp);
       
    SDL_FreeSurface(temp);

    if (image == NULL)
    {
        printf("Failed to convert image %s to native format\n", name);
        return NULL;
    }

    return image;
}


void drawAnimatedEntity(GameObject *entity)
{
    if(entity->etat == IDLE)
    {
        entity->frameNumber = 0;
    }
    else
    {
        if (entity->frameTimer <= 0)
        {
            entity->frameTimer = TIME_BETWEEN_2_FRAMES;
            entity->frameNumber++;
            if(entity->frameNumber >= entity->sprite->w / entity->w)
            {
                 
                entity->frameNumber = 0;
            }
        }
        else
        {
            entity->frameTimer--;
        }
    }

    drawEntity(entity);
}


void drawEntity(GameObject *entity)
{
    SDL_Rect dest,src;

    dest.x = entity->x - map.startX;
    dest.y = entity->y;
    dest.w = entity->w;
    dest.h = entity->h;

    src.x = entity->frameNumber * entity->w;
    src.y = 0;
    src.w = entity->w;
    src.h = entity->h;

    SDL_BlitSurface(entity->sprite, &src, jeu.screen, &dest);
}


void drawHud(void)
{
    //On crée une varuiable qui contiendra notre texte (jusqu'à 200 caractères, y'a de la marge ;) ).
    char text[200];
    int i;
    SDL_Rect dest;

    dest.x = 680;
    dest.y = 20;


    for(i=0;i<jeu.vies;i++)
    {
        SDL_BlitSurface(jeu.HUD_vie, NULL, jeu.screen, &dest);
        dest.x += 20;
    }

    dest.x = 580;
    /* Affiche le nombre d'étoiles en haut à gauche */
    SDL_BlitSurface(jeu.HUD_etoiles, NULL, jeu.screen,&dest);
    sprintf(text, "%d", jeu.score);
    drawString(text, 620, 20, font);

    jeu.time = 120-(SDL_GetTicks()-jeu.timeBegin)/1000;
    sprintf(text,"Time : %d",jeu.time);
    drawString(text, 50, 20, font);
}

 
 
void doFireballs(void)
{
    int i;
 
    //On passe en boucle toutes les boules de feu ;)
    for ( i = 0; i < jeu.nombreFireballs; i++ )
    {
        /* On se déplace : vers la droite :  */
        if (shuriken[i].direction == LEFT)
        {
            shuriken[i].x += 10;
        }
        /* - vers la gauche : */
        else
        {
            shuriken[i].x -= 10;
        }
 
 
        /* Si elle sort de l'écran, on supprime la boule de feu */
        if ( shuriken[i].x < map.startX ||
             shuriken[i].x > map.startX + SCREEN_WIDTH
            )
        {
             shuriken[i] = shuriken[jeu.nombreFireballs-1];
             jeu.nombreFireballs--;
        }
 
    }
 
}
 
 
void drawFireballs(void)
{
 
    int i;
 
    //On affiche toutes les boules de feu
    for ( i = 0; i < jeu.nombreFireballs; i++ )
    {
        drawImage(jeu.Shuriken_image, shuriken[i].x - map.startX, shuriken[i].y - map.startY);
    }
 
}